gettextのRuby 2.7対応
冬休みにちょっとPirkaをi18n対応してみようか、と思いたったのだけどはまってしまって進まなかった。問題は特定した。 raccコマンドを見付けられない
Bundler使ってるから、Gem.bindirはvendor/bundle/ruby/2.7.0/binとかになる
Ruby 2.7からはraccコマンドが標準添付されて、/usr/local/binとかに置かれるようになった。
raccはdefault gemなのでbundle installでインストールされない(インストール済みなので)
するとGem.bindirにraccコマンドが置かれることがない
File.join(Gem.bindir, "racc")では見付けられない
Gem.bindirを指定しないでPATHからraccを探して、ruby(...)じゃなくてsh(...)でraccを実行すればまあ、動くんだけど、いかにもワークアラウンドだな。
gemかbundler調べたら適切なAPI見つかるかしら
Rubyコードのパーサーのためのモジュールが見付からない
もたもたしてる間にkouさんが対応した。素晴らしい。
irbの変更による
ここにあるように古いirbを入れれば動きはするが……irbみたいなグローバルな物にそんなことしたくない
gettextのユースケースの一つにコマンドラインアプリのi18nがあると思う。そうするとBundler環境でなくgem installでそのコマンドを入れることになるから、その時に古いirbが入るの嫌な感じする……
パーサーの要件を調べるところからやらないと直せない
直したいんだけど時間が……一月後半とかならいけるのかしら。
よく分からないので動かしてみた例
code:interpolation.rb
N_("active"); N_("inactive"); N_("paused") # possible value of status for parser to find. status = N_("active")
これはmsgid "Your account is #{account_state}."として抜き出される。
code:pot
#: interpolation.rb:1 interpolation.rb:2 msgid "active"
msgstr ""
msgid "inactive"
msgstr ""
msgid "paused"
msgstr ""
msgstr ""
抜き出した時の最初と最後の"はどこで入れられる?
po_entry.rbで明示的に入れてる。String#dump使ったり、そもそも抜き出す時にクオーテーションマークも一緒に抜き出したり、ということはしてない。
そりゃそうか、"..."だけじゃなくて%Q|...|とかもあるからな。
irbから何か借りるのはやめて、Ripperだけを使うのがよさそう。
lexよりはsexpの方がいいだろう
ちょっとだけ抽象的なので、細かいことを考えなくていい
Experimentalって言われているのが気になるが……
と思ったけど、sexpはコメントを無視しちゃうようなので、カスタマイズするかlexを使うかになる。
Ripperを継承したクラスを作るのがよさそう・・・
GetText::RubyLexer < Ripperもしくは< Ripper::Lexer
code:ripper_tree.rb
if event_id.instance_of?(Array)
return
end
:fcallと:commandに注目すればよい?
関連